package org.zoomdev.zoom.aop;

import java.lang.reflect.Method;

/**
 * ProxyObject 表示一个代理类描述对象
 * create方法会在实例化代理接口或者抽象类的具体实例的时候调用，在该实例的生命周期中，仅会调用一次
 * invoke方法表示执行代理接口的方法或者抽象类的抽象方法的时候执行本代理方法。
 *
 * @param <T>
 */
public interface ProxyObject<T> {
    /**
     * 第一次调用方法的时候会调用本方法
     * 返回一个配置对象T，一般用于解析method的注解，生成调用对象,需要自定义该调用对象
     *
     *
     * @param instance
     * @param method
     * @return
     */
    T create(Class<?> interfaceOrAbstractClass, Object instance, Method method);

    /**
     * 代理方法
     *
     * @param config
     * @param args
     * @return
     * @throws Throwable
     */
    Object invoke(T config, Object[] args) throws Throwable;

}
